// LogIdle.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
//#include <boost/mpl/has_xxx.hpp>
//#include <iostream>
#include "IObject.h"
#include "A.h"
//BOOST_MPL_HAS_XXX_TRAIT_DEF(has_xxx)
//BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_xxx, xxx, false)
// BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_xxx, xxx, true)
// struct test1 {};
// struct test2 { void xxx(); };
// struct test3 { int xxx; };
// struct test4 { static int xxx(); };
// struct test5 { template< typename T > struct xxx {}; };
// struct test6 { typedef int xxx; };
// struct test7 { struct xxx; };
// struct test8 { typedef void (*xxx)(); };
// struct test9 { typedef void (xxx)(); };
class A;
class B;
class C;
int main()
{
//	IObject* i = IObject::Create<A>();
//	IObject::Do<float>();
	IObject* i;
	A* a;
	Factory::Create<A>(i);
	Factory::Destory(i);

  	Factory::Create<B>(i);
 	Factory::Create<A>(a);
 
 	Factory::Create<B>(a);
  	B* b;
  	Factory::Create<C>(b);
 	Factory::Create<C>(i);
 	Factory::Create<C>(a);
	Factory::Destory(a);
//  	Factory::Create<A>(a, 1.0f);
//  	Factory::Create<A>(a, 1);
//  	Factory::Create<A>(a, 1, 1);

	
//	A* a = Cast(New<B>(), Type2Type<A>());
	//a = Cast(New<C>(), Type2Type<A>());
//  	using namespace boost::mpl;
//  	using namespace boost;
// 
// 	std::cout << has_xxx<test1>::value;
// 	std::cout << has_xxx<test2>::value;
// 	std::cout << has_xxx<test3>::value;
// 	std::cout << has_xxx<test6>::value;
// 	std::cout << has_xxx<test7>::value;
// 

	

// 	BOOST_MPL_ASSERT_NOT(( has_xxx<test1> ));
// 	BOOST_MPL_ASSERT_NOT(( has_xxx<test2> ));
// 	BOOST_MPL_ASSERT_NOT(( has_xxx<test3> ));
// 	BOOST_MPL_ASSERT_NOT(( has_xxx<test4> ));
// 	BOOST_MPL_ASSERT_NOT(( has_xxx<test5> ));
// 
// 	#if !defined(BOOST_MPL_CFG_NO_HAS_XXX)
// 	BOOST_MPL_ASSERT(( has_xxx<test6> ));
// 	BOOST_MPL_ASSERT(( has_xxx<test7> ));
// 	BOOST_MPL_ASSERT(( has_xxx<test8> ));
// 	BOOST_MPL_ASSERT(( has_xxx<test9> ));
// 	#endif
// 
// 	BOOST_MPL_ASSERT(( has_xxx<test6,true_> ));
// 	BOOST_MPL_ASSERT(( has_xxx<test7,true_> ));
// 	BOOST_MPL_ASSERT(( has_xxx<test8,true_> ));
// 	BOOST_MPL_ASSERT(( has_xxx<test9,true_> ));
}

// namespace van {
// 	namespace type_traits 
// 	{
// 		namespace detail 
// 		{
// 			typedef char Small;
// 			struct Big {char dummy[2];};
// 
// 			template<typename Type,Type Ptr>
// 			struct MemberHelperClass;
// 
// 			template<typename T,typename Type>
// 			Small MemberHelper_f(MemberHelperClass<Type,&T::f> *);
// 			template<typename T,typename Type>
// 			Big MemberHelper_f(...);
// 			}
// 
// 			template<typename T,typename Type>
// 			struct has_member_f
// 			{
// 				enum {value=sizeof(detail::MemberHelper_f<T,Type>(0))==sizeof(detail::Small)
// 			};
// 		};
// 	}
// }
// 
// struct A
// {
// 	static void f() {};
// };
// struct B
// {
// 	void a(){};
// };
// 
// #include <iostream>
// using namespace std;
// 
// int main()
// {
// 	cout<<boolalpha;
// 	cout<<van::type_traits::has_member_f<A,void (*)()>::value<<endl;
// 	cout<<van::type_traits::has_member_f<B,void (*)()>::value<<endl;
// }
// // 
// int _tmain(int argc, _TCHAR* argv[])
// {
// 	SetProcessAffinityMask(GetCurrentProcess(),0x1);
// 	
// 	while (1)
// 	{
// 		//int t = GetTickCount();
// 		unsigned __int64 t = 0;
// 		wprintf(L"f");
// 		while(t < 800000000) ++t;
// 		wprintf(L"s");
// 		Sleep(2000);
// 	}
// 	
// 	
// 	return 0;
// }

